package cz.jm.web.jmlib.client.dialog.login;

import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.Widget;

import cz.jm.web.jmlib.client.base.BlockingPresenter;
import cz.jm.web.jmlib.client.base.View;
import cz.jm.web.jmlib.client.dialog.validation.Validable;

/** Bazovy prezenter pre prihlasenie sa do aplikacie. 
 * Odvodeny prezenter len implementuje metodu {@linkplain #login(String, String)}, v ktorej overi 
 * prihlasovacie udaje. Ako view je mozne pouzit predpripravenu implementaciu {@linkplain LoginView}. 
 * <br><br>
 * Dolezite je odblokovat aplikaciu po skonceni overovania pretoze bazovy presenter zablokuje
 * aplikaciu ale sam ju uz neuvolni pretoze nevie kedy sa skonci prihlasovanie. Odblokovanie 
 * je mozne pomocou {@linkplain #unblockApplication()}
 * 
 * TODO doplnit zapamatanie si prihlaseneho uzivatela pomocou session
 * */
public abstract class LoginPresenter extends BlockingPresenter {
	
	public interface Display extends View, Validable {
		String getUsername();
		String getPassword();	
		HasClickHandlers getOk();
	}

	protected final LoginConstants constants = GWT.create(LoginConstants.class);
	private Display view;
	
	
	public LoginPresenter(Display display) {
		this.view = display;
		
		view.getOk().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {				
				
				if (!view.isValid()) return;
				
				blockApplication();
								
				login(view.getUsername(), view.getPassword());
															
			}
		});
	}

	/** Metoda sluzi ako predanie toku programu z prihlasovania sa do aplikacie. 
	 * Uloho metody je overenie prihlasovacieho mena a hesla, a nasledne dalsie kroky 
	 * podla vysledku overovania. 
	 * 
	 * Dolezite je odblokovat aplikaciu po skonceni overovania pretoze bazovy presenter zablokuje
	 * aplikaciu ale sam ju uz neuvolni pretoze nevie kedy sa skonci prihlasovanie. Odblokovanie 
	 * je mozne pomocou {@linkplain #unblockApplication()} 
	 *   */
	abstract public void login(String userName, String password);
	
	@Override
    public void go(LayoutPanel workingArea) {
	    final Widget w = view.asWidget();	    
	    addCentredWidget(workingArea, w);
    }
	
}
